//The MIT License
//
//Copyright (c) <2011> <GEPAR - Grupo de Ensino e Pesquisa em Agroinformática e Rastreabilidade>
//
//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions:
//
//The above copyright notice and this permission notice shall be included in
//all copies or substantial portions of the Software.
//
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//THE SOFTWARE.

package gui;

import core.TabulacaoDAO;
import java.awt.Color;
import java.sql.Date;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import javax.swing.table.DefaultTableModel;

public class PanelEnviaTabulacoes extends javax.swing.JPanel {

    /**
     * Painel de abas em que está janela está contida.
     */
    private JTabbedPane tabPai;

    /**
     * Referência ao JMenuItem de FramePrincipal. Serve para garantir
     * que somente uma janela do tipo PanelEnviaTabulacoes seja aberta.
     */
    private JMenuItem mitemEnviarTabul;

    private DefaultTableModel modeloTblTabul;

    /**
     * Ids das tabulações que ainda não foram enviadas para o servidor.
     */
    private ArrayList<Integer> idsTabulacoesPen = new ArrayList<Integer>();

    public PanelEnviaTabulacoes(JTabbedPane tabPai, JMenuItem mitemEnviarTabul)
    {
        initComponents();

        this.tabPai = tabPai;
        this.mitemEnviarTabul = mitemEnviarTabul;
        this.modeloTblTabul = (DefaultTableModel)this.tblTabulacoesPendentes.getModel();
        
        // desativamos o item do menu que permite a abertura de janelas do tipo PanelEnviaTabulacoes
        this.mitemEnviarTabul.setEnabled(false);

        this.popularComTabulacoesPen();
        this.verificarTabulacoesPen();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        tblTabulacoesPendentes = new javax.swing.JTable();
        lblStatusGeral = new javax.swing.JLabel();
        lblTitEnviarServidor = new javax.swing.JLabel();
        lblTitStatusEnvio = new javax.swing.JLabel();
        lblStatusEnvio = new javax.swing.JLabel();
        btnEnviarTabulacoes = new javax.swing.JButton();
        lblEmail = new javax.swing.JLabel();
        lblSenha = new javax.swing.JLabel();
        txtEmail = new javax.swing.JTextField();
        txtSenha = new javax.swing.JPasswordField();
        lblExcluirTabul = new javax.swing.JLabel();
        btnExcluirTabul = new javax.swing.JButton();
        lblErroExclusao = new javax.swing.JLabel();
        btnFecharJanela = new javax.swing.JButton();

        jLabel1.setText("jLabel1");

        jLabel3.setText("jLabel3");

        tblTabulacoesPendentes.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Data da coleta", "Produto", "Entreposto"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jScrollPane1.setViewportView(tblTabulacoesPendentes);
        tblTabulacoesPendentes.getColumnModel().getColumn(0).setResizable(false);
        tblTabulacoesPendentes.getColumnModel().getColumn(1).setResizable(false);
        tblTabulacoesPendentes.getColumnModel().getColumn(2).setResizable(false);
        tblTabulacoesPendentes.getColumnModel().getColumn(2).setPreferredWidth(200);

        lblStatusGeral.setForeground(new java.awt.Color(153, 153, 0));
        lblStatusGeral.setText("As tabulações abaixo listadas ainda não foram enviadas para o servidor.");

        lblTitEnviarServidor.setFont(new java.awt.Font("Tahoma", 1, 14));
        lblTitEnviarServidor.setText("Enviar tabulações para o servidor");

        lblTitStatusEnvio.setText("Status do envio:");

        lblStatusEnvio.setForeground(new java.awt.Color(153, 153, 0));
        lblStatusEnvio.setText("aguardando ordem do usuário");

        btnEnviarTabulacoes.setText("Enviar tabulações");
        btnEnviarTabulacoes.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnEnviarTabulacoesActionPerformed(evt);
            }
        });

        lblEmail.setText("E-mail");

        lblSenha.setText("Senha");

        lblExcluirTabul.setFont(new java.awt.Font("Ubuntu", 2, 15));
        lblExcluirTabul.setText("Para excluir, selecione uma linha e clique no botão \"Excluir tabulação\", abaixo da tabela.");

        btnExcluirTabul.setText("Excluir tabulação");
        btnExcluirTabul.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExcluirTabulActionPerformed(evt);
            }
        });

        lblErroExclusao.setForeground(java.awt.Color.red);
        lblErroExclusao.setText("Mensagem de erro caso não haja linha selecionada");

        btnFecharJanela.setText("Fechar esta janela");
        btnFecharJanela.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnFecharJanelaActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(btnFecharJanela)
                    .addComponent(lblStatusGeral)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 662, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblExcluirTabul)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(btnExcluirTabul)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblErroExclusao))
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                            .addComponent(lblSenha)
                            .addGap(18, 18, 18)
                            .addComponent(txtSenha))
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                            .addComponent(lblEmail)
                            .addGap(18, 18, 18)
                            .addComponent(txtEmail))
                        .addComponent(lblTitEnviarServidor, javax.swing.GroupLayout.Alignment.LEADING))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(lblTitStatusEnvio)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblStatusEnvio))
                    .addComponent(btnEnviarTabulacoes))
                .addContainerGap(211, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(btnFecharJanela)
                .addGap(18, 18, 18)
                .addComponent(lblStatusGeral)
                .addGap(18, 18, 18)
                .addComponent(lblExcluirTabul)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 169, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnExcluirTabul)
                    .addComponent(lblErroExclusao))
                .addGap(18, 18, 18)
                .addComponent(lblTitEnviarServidor)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtEmail, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblEmail))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtSenha, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblSenha))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblStatusEnvio)
                    .addComponent(lblTitStatusEnvio))
                .addGap(18, 18, 18)
                .addComponent(btnEnviarTabulacoes)
                .addContainerGap(138, Short.MAX_VALUE))
        );
    }// </editor-fold>//GEN-END:initComponents

    private void btnEnviarTabulacoesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEnviarTabulacoesActionPerformed

        this.btnEnviarTabulacoes.setEnabled(false);
        this.lblStatusEnvio.setForeground(new Color(00, 99, 00)); // cor verde
        this.lblStatusEnvio.setText("enviando . . .");

        TabulacaoDAO tabulacaoDAO = new TabulacaoDAO();

        String emailTabulador = this.txtEmail.getText();
        char[] senhaTabulador = this.txtSenha.getPassword();
        
        int resultado = tabulacaoDAO.enviarTabulacoesPen(emailTabulador, String.valueOf(senhaTabulador));

        // por questões de segurança, inicializamos o vetor senhaTabulador
        for (int i = 0; i < senhaTabulador.length; i++)
        {
            senhaTabulador[i] = '0';
        }

        // avaliando o resultado do envio ao servidor
        switch (resultado)
        {
            case TabulacaoDAO.erro_conexao:

                this.lblStatusEnvio.setForeground(Color.red);
                this.lblStatusEnvio.setText("<html>não foi possível se conectar com o servidor;"
                        + " verifique sua conexão com a Internet<br />(se você estiver na Fatec, abra o navegador e entre"
                        + " em alguns sites; depois, tente enviar as tabulações novamente)</html>");
                this.btnEnviarTabulacoes.setEnabled(true);
                break;

            case TabulacaoDAO.erro_login:

                this.lblStatusEnvio.setForeground(Color.red);
                this.lblStatusEnvio.setText("usuário ou senha incorretos");
                this.btnEnviarTabulacoes.setEnabled(true);
                break;

            case TabulacaoDAO.erro_interno:

                this.lblStatusEnvio.setForeground(Color.red);
                this.lblStatusEnvio.setText("<html>envio abortado por erro interno. Por favor, envie um e-mail"
                        + " para hermes.fatecmc@gmail.com<br />descrevendo (com o máximo de detalhes que puder"
                        + "; por exemplo: hora do erro, produtos das coletas que estavam sendo enviadas etc)<br />"
                        + " o cenário onde ocorreu este erro</html>");
                this.btnEnviarTabulacoes.setEnabled(true);
                break;
                
            case TabulacaoDAO.interrompida:
                
                this.lblStatusEnvio.setForeground(Color.red);
                this.lblStatusEnvio.setText("<html>envio interrompido no servidor. Por favor, feche esta aba"
                        + " e tente realizar o envio novamente. Caso não conseguir, por favor envie"
                        + " um e-mail para hermes.fatecmc@gmail.com<br />descrevendo (com o máximo de detalhes que puder"
                        + "; por exemplo: hora do erro, produtos das coletas que estavam sendo enviadas etc)<br />"
                        + " o cenário onde ocorreu este erro</html>");
                this.btnEnviarTabulacoes.setEnabled(true);
                break;
                

            case TabulacaoDAO.sucesso:

                this.lblStatusEnvio.setForeground(new Color(00, 99, 00)); // cor verde
                this.lblStatusEnvio.setText("envio concluído");
                this.lblStatusGeral.setForeground(new Color(00, 99, 00));
                this.lblStatusGeral.setText("As tabulações abaixo listadas foram enviadas com sucesso para o servidor.");
                this.txtEmail.setEnabled(false);
                this.txtSenha.setEnabled(false);
                this.lblErroExclusao.setVisible(false);
                this.btnExcluirTabul.setEnabled(false);
                break;
        }
    }//GEN-LAST:event_btnEnviarTabulacoesActionPerformed

    private void btnExcluirTabulActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExcluirTabulActionPerformed
        // TODO add your handling code here:

        int indLinhaSelec = this.tblTabulacoesPendentes.getSelectedRow();

        if (indLinhaSelec != -1)
        {
            // há uma linha selecionada
            this.modeloTblTabul.removeRow(indLinhaSelec);

            int idTabulacao = this.idsTabulacoesPen.get(indLinhaSelec);

            try
            {
                new TabulacaoDAO().excluirTabulacaoPen(idTabulacao);
                
            } catch(Exception e)
            {
                JOptionPane.showMessageDialog(null, e.getMessage());
            }

            this.lblErroExclusao.setVisible(false);
            this.verificarTabulacoesPen();
        }
        else
        {
            // não há linhas selecionadas
            this.lblErroExclusao.setText("Selecione uma tabulação para excluir.");
            this.lblErroExclusao.setVisible(true);
        }
    }//GEN-LAST:event_btnExcluirTabulActionPerformed

    private void btnFecharJanelaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnFecharJanelaActionPerformed

        this.mitemEnviarTabul.setEnabled(true);
        tabPai.remove(this);
    }//GEN-LAST:event_btnFecharJanelaActionPerformed


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnEnviarTabulacoes;
    private javax.swing.JButton btnExcluirTabul;
    private javax.swing.JButton btnFecharJanela;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JLabel lblEmail;
    private javax.swing.JLabel lblErroExclusao;
    private javax.swing.JLabel lblExcluirTabul;
    private javax.swing.JLabel lblSenha;
    private javax.swing.JLabel lblStatusEnvio;
    private javax.swing.JLabel lblStatusGeral;
    private javax.swing.JLabel lblTitEnviarServidor;
    private javax.swing.JLabel lblTitStatusEnvio;
    private javax.swing.JTable tblTabulacoesPendentes;
    private javax.swing.JTextField txtEmail;
    private javax.swing.JPasswordField txtSenha;
    // End of variables declaration//GEN-END:variables

    /**
     * Popula a tabela com as tabulações pendentes que foram recuperadas do servidor.
     */
    private void popularComTabulacoesPen()
    {
        TabulacaoDAO tabulacaoDAO = new TabulacaoDAO();

        try
        {
            ResultSet resultados = tabulacaoDAO.obterTabulacoesPendentes();

            // populando a tabela de tabulações pendentes com os dados recuperados do banco local
            while (resultados.next())
            {
                Integer idAtual = resultados.getInt("id_tabulacao");
                this.idsTabulacoesPen.add(idAtual);

                Date dataCol = resultados.getDate("data_col");
                SimpleDateFormat sdateFormat = new SimpleDateFormat("dd/MM/yyyy");
                String textoDataCol = sdateFormat.format(dataCol);

                String nomeProd = resultados.getString("nome_prod");
                String nomeEntrep = resultados.getString("nome_entrep");

                Object[] novaLinha = new Object[3];
                novaLinha = new Object[]{textoDataCol, nomeProd, nomeEntrep};
                this.modeloTblTabul.addRow(novaLinha);
            }
        }
        catch(Exception e)
        {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
    }


    /**
     * Responsável por ativar / desativar componentes, deixando a interface
     * adequada à situação atual (se há ou não tabulações pendentes).
     */
    private void verificarTabulacoesPen()
    {
        int qtdeTabulacoes = this.modeloTblTabul.getRowCount();

        this.lblErroExclusao.setVisible(false);

        if (qtdeTabulacoes == 0)
        {
            // não há tabulações pendentes; logo, os principais componentes da interface são desativados

            this.lblStatusGeral.setText("Não há tabulações pendentes para serem enviadas ao servidor");
            this.btnExcluirTabul.setEnabled(false);
            this.txtEmail.setEnabled(false);
            this.txtSenha.setEnabled(false);
            this.lblStatusEnvio.setText("não há tabulações pendentes");
            this.btnEnviarTabulacoes.setEnabled(false);
        }
    }

}
